home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / packet / monax25 / cdtmr.asm < prev    next >
Assembly Source File  |  1987-10-19  |  4KB  |  181 lines

  1. ;
  2. ;This module samples the TNC CD line 18.2 times a second.
  3. ;One long counter is incremented when the CD line is found active,
  4. ;another counter is incremented if the CD line is inactive.
  5. ;
  6. ; This module is part of stats.exe
  7. ;
  8. ;  Hardware: IBM PC or compatable serial port (8250)
  9. ;                  
  10. ;   Language = Microsoft Macro Assembler version 4.0
  11. ;
  12. ;   This source is distributed freely and may be copied and
  13. ;   redistributed with the following provisos:
  14. ;   
  15. ;           You may not sell it, nor may you charge for making 
  16. ;           copies beyond the actual cost of mailing and media.
  17. ;                      
  18. ;   Written by Skip Hansen WB6YMH and Harold Price NK6K.
  19. ;
  20. ;   Feedback is desired.
  21. ;
  22. ;   RCP/M (213) 541-2503 300/1200/2400 baud
  23. ;   or via packet WB6YMH @ WB6YMH-2 or 
  24. ;         NK6K @ NK6K
  25. ;
  26. ;   Modification history:
  27. ;
  28. ;    8/10/87         WB6YMH: Initial release.    
  29. ;    ver 1.0         
  30. ;
  31.  
  32. ;
  33. ;macro to increment a long integer
  34. ;
  35. bump    macro    variable
  36.     local    next            ;
  37.     inc    word ptr variable    ;
  38.     jnz    next            ;
  39.     inc    word ptr variable+2    ;
  40. next:
  41.     endm
  42.  
  43. _TEXT   SEGMENT BYTE    PUBLIC  'CODE'
  44. _TEXT   ENDS
  45. _DATA   SEGMENT WORD    PUBLIC  'DATA'
  46. _DATA   ENDS
  47. CONST   SEGMENT WORD    PUBLIC  'CONST'
  48. CONST   ENDS
  49. _BBS    SEGMENT WORD    PUBLIC  'BBS'
  50. _BBS    ENDS
  51.                 subttl  Data Areas
  52.                 page
  53. DGROUP  GROUP   CONST,  _BBS,   _DATA
  54.  
  55.         ASSUME  CS:_TEXT, DS:DGROUP, SS:DGROUP
  56.  
  57. _DATA   SEGMENT
  58.     extrn    port_base:word
  59.  
  60. _DATA   ENDS
  61.  
  62. _TEXT   SEGMENT
  63.  
  64. base        dw    ?        ;base adr of com port in use
  65. old_8        dd    ?        ;old interrupt 8 vector
  66. cd_active    dd    0        ;
  67. cd_inactive    dd    0        ;
  68.  
  69. ;
  70. ;Intercept 18.2 hz ticker for CD timing
  71. ;
  72.  
  73.     public    _tick_init
  74.  
  75. _tick_init:    push    bp            ;save registers
  76.         push    si            ;
  77.         push    di            ;
  78.         push    es            ;
  79.         push    ds            ;
  80.         mov    ah,35h            ;get old ticker interrupt
  81.         mov    al,8            ;
  82.         int    21h            ;
  83.         mov    word ptr cs:old_8,bx    ;save old interrupt vector
  84.         mov    word ptr cs:old_8+2,es    ;
  85.         mov    ax,cs            ;set up ds
  86.         mov    ds,ax            ;
  87.         mov    ah,25h            ;set our interrupt
  88.         mov    al,8            ;
  89.         mov    dx,offset int8_hdlr    ;
  90.         int    21h            ;
  91.         pop    ds            ;restore registers
  92.         pop    es            ;
  93.         pop    di            ;
  94.         pop    si            ;
  95.         pop    bp            ;
  96.         ret                ;
  97.  
  98.  
  99. ;
  100. ;Remove cd sampler from int 8 chain
  101. ;
  102.           public    _tick_stop
  103. _tick_stop:    push    bp            ;save registers
  104.         push    si            ;
  105.         push    di            ;
  106.         push    ds            ;
  107.         mov    dx,word ptr cs:old_8    ;get old interrupt vector
  108.         mov    ax,word ptr cs:old_8+2    ;
  109.         mov    ds,ax            ;set up dx
  110.         mov    ah,25h            ;reset old interrupt 
  111.         mov    al,8            ;
  112.         int    21h            ;
  113.         pop    ds            ;restore registers
  114.         pop    di            ;
  115.         pop    si            ;
  116.         pop    bp            ;
  117.         ret                ;
  118.  
  119. ;
  120. ;Save COM port base address for background program
  121. ;
  122.         public    _set_base
  123. _set_base:    push    bp              ;save BP
  124.                 mov     bp,sp           ;point to passed parms
  125.                 mov     ax,[bp+4]       ;get base adr
  126.         mov    cs:base,ax    ;save for interrupt handler
  127.         pop    bp        ;
  128.         ret            ;
  129.  
  130. ;
  131. ;Ticker interrupt handler.  Sample current state of CD line and
  132. ;increment appropriate counter.
  133. ;
  134.  
  135. int8_hdlr:    push    ax        ;save registers
  136.         push    dx        ;
  137.         mov    dx,cs:base    ;
  138.         add    dx,6        ;point to modem status register
  139.         in    al,dx        ;
  140.         and    al,80h        ;CD active ?
  141.         jnz    inactive    ;jump if not
  142.         bump    cs:cd_active    ;
  143.         jmp    chain_nxt    ;continue
  144.  
  145. inactive:    bump    cs:cd_inactive    ;
  146.  
  147. chain_nxt:    pop    dx        ;restore registers
  148.         pop    ax        ;
  149.         jmp    cs:old_8    ;chain to next handler in line
  150.  
  151. ;
  152. ;Read and clear the cd_active variable
  153. ;
  154.  
  155.         public    _get_cd_active
  156.  
  157. _get_cd_active:    mov    ax,word ptr cs:cd_active    ;get lsb
  158.         mov    dx,word ptr cs:cd_active+2    ;and msb
  159.         mov    word ptr cs:cd_active,0        ;clear counter
  160.         mov    word ptr cs:cd_active+2,0    ;
  161.         ret                    ;
  162.  
  163. ;
  164. ;Read and clear the cd_inactive variable
  165. ;
  166.  
  167.         public    _get_cd_inactive
  168.  
  169. _get_cd_inactive:    
  170.         mov    ax,word ptr cs:cd_inactive    ;get lsb
  171.         mov    dx,word ptr cs:cd_inactive+2    ;and msb
  172.         mov    word ptr cs:cd_inactive,0    ;clear counter
  173.         mov    word ptr cs:cd_inactive+2,0    ;
  174.         ret                    ;
  175.  
  176.  
  177.  
  178. _TEXT   ENDS
  179.         end
  180.  
  181.